<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>5.8.5.1-迭代器方法</title>
</head>

<body>
    <div id="container"></div>
</body>
    <script>
    /**
     * 集合类型有三个迭代器方法
     *  entries
     *  keys
     *  values
     * 
     * 调用这些方法会得到相应的迭代器，并且可以使用 for...of 进行循环迭代
     * */
    const m = new Map([
        ['key1', 'value1'],
        ['key2', 'value2']
    ])

    for (const [key, value] of m.entries()) {
        console.log(key, value) // key1 value1 key2 value2
    }


    /**
     * Map 或 Set 类型本身部署了 Symbol.iterator 方法，
     *  因此它们可以使用 for...of 进行迭代
    */
   for (const [key, value] of m) {
       console.log(key, value) // key1 value1 key2 value2
   }


   /**
    * 也可以调用迭代器函数取得迭代器对象后，
    *  手动调用迭代器对象的 next 方法获取对应的值
   */
    const itr = m[Symbol.iterator]();
    console.log(itr.next()) // { value: [ 'key1', 'value1' ], done: false }
    console.log(itr.next()) // { value: [ 'key2', 'value2' ], done: false }
    console.log(itr.next()) // { value: undefined, done: true }


    /**
     * m[Symbol.iterator] 与 m.entries 是等价
     * - 使用 for...of 循环迭代 m.entries 和 m 会得到同样的结果
     * */ 
    console.log(m[Symbol.iterator] === m.entries) // true
</script>

</html>